{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 读取数据\n",
    "filepath = './train.txt'\n",
    "def loadData(filepath):\n",
    "    dataMat = []\n",
    "    labelMat = []\n",
    "    fr = open(filepath)\n",
    "    for line in fr.readlines():\n",
    "        lineArr = line.strip().split()\n",
    "        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])]) # 1.0表示的是常数项，如有两个参数x1，x2,w1+w2*x1+w3*x2\n",
    "        labelMat.append([int(lineArr[2])])\n",
    "    return dataMat,labelMat\n",
    "# s=loadData(filepath)\n",
    "# print(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "0\n"
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "<matplotlib.collections.PathCollection at 0x27201c54f40>"
     },
     "metadata": {},
     "execution_count": 4
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n<svg height=\"248.518125pt\" version=\"1.1\" viewBox=\"0 0 380.482812 248.518125\" width=\"380.482812pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <metadata>\r\n  <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\r\n   <cc:Work>\r\n    <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\r\n    <dc:date>2020-07-23T10:30:02.374637</dc:date>\r\n    <dc:format>image/svg+xml</dc:format>\r\n    <dc:creator>\r\n     <cc:Agent>\r\n      <dc:title>Matplotlib v3.3.0, https://matplotlib.org/</dc:title>\r\n     </cc:Agent>\r\n    </dc:creator>\r\n   </cc:Work>\r\n  </rdf:RDF>\r\n </metadata>\r\n <defs>\r\n  <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\r\n </defs>\r\n <g id=\"figure_1\">\r\n  <g id=\"patch_1\">\r\n   <path d=\"M -0 248.518125 \r\nL 380.482812 248.518125 \r\nL 380.482812 0 \r\nL -0 0 \r\nz\r\n\" style=\"fill:none;\"/>\r\n  </g>\r\n  <g id=\"axes_1\">\r\n   <g id=\"patch_2\">\r\n    <path d=\"M 38.482813 224.64 \r\nL 373.282813 224.64 \r\nL 373.282813 7.2 \r\nL 38.482813 7.2 \r\nz\r\n\" style=\"fill:#ffffff;\"/>\r\n   </g>\r\n   <g id=\"PathCollection_1\">\r\n    <defs>\r\n     <path d=\"M 0 3 \r\nC 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\nC 2.683901 1.55874 3 0.795609 3 0 \r\nC 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\nC 1.55874 -2.683901 0.795609 -3 0 -3 \r\nC -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\nC -2.683901 -1.55874 -3 -0.795609 -3 0 \r\nC -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\nC -1.55874 2.683901 -0.795609 3 0 3 \r\nz\r\n\" id=\"mc5ae2b20c3\" style=\"stroke:#0000ff;\"/>\r\n    </defs>\r\n    <g clip-path=\"url(#pdb29a83604)\">\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"219.531899\" xlink:href=\"#mc5ae2b20c3\" y=\"24.64998\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"185.923403\" xlink:href=\"#mc5ae2b20c3\" y=\"107.536417\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"159.833736\" xlink:href=\"#mc5ae2b20c3\" y=\"100.761254\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"239.708343\" xlink:href=\"#mc5ae2b20c3\" y=\"57.723034\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"250.873778\" xlink:href=\"#mc5ae2b20c3\" y=\"39.11743\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"246.390648\" xlink:href=\"#mc5ae2b20c3\" y=\"74.333779\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"219.119196\" xlink:href=\"#mc5ae2b20c3\" y=\"64.638293\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"281.976959\" xlink:href=\"#mc5ae2b20c3\" y=\"34.329758\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"138.809695\" xlink:href=\"#mc5ae2b20c3\" y=\"79.306252\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"193.959299\" xlink:href=\"#mc5ae2b20c3\" y=\"49.734408\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"276.062455\" xlink:href=\"#mc5ae2b20c3\" y=\"73.801458\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"186.757456\" xlink:href=\"#mc5ae2b20c3\" y=\"79.298156\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"285.153716\" xlink:href=\"#mc5ae2b20c3\" y=\"73.556398\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"276.380309\" xlink:href=\"#mc5ae2b20c3\" y=\"51.847391\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"232.930229\" xlink:href=\"#mc5ae2b20c3\" y=\"74.390122\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"241.868489\" xlink:href=\"#mc5ae2b20c3\" y=\"76.719265\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"133.882154\" xlink:href=\"#mc5ae2b20c3\" y=\"74.400987\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"150.430248\" xlink:href=\"#mc5ae2b20c3\" y=\"45.634926\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"166.10773\" xlink:href=\"#mc5ae2b20c3\" y=\"54.914272\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"192.025636\" xlink:href=\"#mc5ae2b20c3\" y=\"65.815853\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"163.706506\" xlink:href=\"#mc5ae2b20c3\" y=\"63.30043\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"176.418981\" xlink:href=\"#mc5ae2b20c3\" y=\"52.200624\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"242.890454\" xlink:href=\"#mc5ae2b20c3\" y=\"58.399775\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"228.801876\" xlink:href=\"#mc5ae2b20c3\" y=\"83.458767\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"204.062277\" xlink:href=\"#mc5ae2b20c3\" y=\"65.760812\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"202.135706\" xlink:href=\"#mc5ae2b20c3\" y=\"90.772848\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"258.077543\" xlink:href=\"#mc5ae2b20c3\" y=\"28.209683\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"204.597921\" xlink:href=\"#mc5ae2b20c3\" y=\"61.442357\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"178.298745\" xlink:href=\"#mc5ae2b20c3\" y=\"52.146786\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"220.008566\" xlink:href=\"#mc5ae2b20c3\" y=\"79.550694\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"236.631101\" xlink:href=\"#mc5ae2b20c3\" y=\"42.3558\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"236.012092\" xlink:href=\"#mc5ae2b20c3\" y=\"44.194559\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"279.666373\" xlink:href=\"#mc5ae2b20c3\" y=\"51.62459\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"242.093233\" xlink:href=\"#mc5ae2b20c3\" y=\"46.854258\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"184.499533\" xlink:href=\"#mc5ae2b20c3\" y=\"58.218868\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"223.760041\" xlink:href=\"#mc5ae2b20c3\" y=\"58.065271\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"215.635062\" xlink:href=\"#mc5ae2b20c3\" y=\"27.842287\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"244.056179\" xlink:href=\"#mc5ae2b20c3\" y=\"70.602455\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"266.796458\" xlink:href=\"#mc5ae2b20c3\" y=\"96.139246\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"151.246776\" xlink:href=\"#mc5ae2b20c3\" y=\"112.793759\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"303.660454\" xlink:href=\"#mc5ae2b20c3\" y=\"66.22393\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"284.398224\" xlink:href=\"#mc5ae2b20c3\" y=\"40.360223\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"303.869367\" xlink:href=\"#mc5ae2b20c3\" y=\"39.642957\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"229.371653\" xlink:href=\"#mc5ae2b20c3\" y=\"72.173134\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"255.172611\" xlink:href=\"#mc5ae2b20c3\" y=\"61.702926\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"283.872417\" xlink:href=\"#mc5ae2b20c3\" y=\"76.614378\"/>\r\n     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"234.843119\" xlink:href=\"#mc5ae2b20c3\" y=\"17.083636\"/>\r\n    </g>\r\n   </g>\r\n   <g id=\"PathCollection_2\">\r\n    <defs>\r\n     <path d=\"M -3 3 \r\nL 3 3 \r\nL 3 -3 \r\nL -3 -3 \r\nz\r\n\" id=\"m92a212e5af\" style=\"stroke:#ff0000;\"/>\r\n    </defs>\r\n    <g clip-path=\"url(#pdb29a83604)\">\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"156.481648\" xlink:href=\"#m92a212e5af\" y=\"128.230098\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"238.946124\" xlink:href=\"#m92a212e5af\" y=\"101.704542\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"107.775604\" xlink:href=\"#m92a212e5af\" y=\"103.916444\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"259.248576\" xlink:href=\"#m92a212e5af\" y=\"103.326004\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"274.181821\" xlink:href=\"#m92a212e5af\" y=\"144.726117\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"194.413135\" xlink:href=\"#m92a212e5af\" y=\"116.246116\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"262.963906\" xlink:href=\"#m92a212e5af\" y=\"162.126552\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"219.230241\" xlink:href=\"#m92a212e5af\" y=\"111.802898\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"218.669844\" xlink:href=\"#m92a212e5af\" y=\"149.976884\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"211.326483\" xlink:href=\"#m92a212e5af\" y=\"174.759976\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"266.753449\" xlink:href=\"#m92a212e5af\" y=\"116.186596\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"311.17338\" xlink:href=\"#m92a212e5af\" y=\"144.024602\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"142.855187\" xlink:href=\"#m92a212e5af\" y=\"185.809065\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"204.469672\" xlink:href=\"#m92a212e5af\" y=\"198.176107\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"123.133723\" xlink:href=\"#m92a212e5af\" y=\"150.181132\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"53.700994\" xlink:href=\"#m92a212e5af\" y=\"197.507197\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"234.795352\" xlink:href=\"#m92a212e5af\" y=\"140.789045\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"202.661833\" xlink:href=\"#m92a212e5af\" y=\"135.656291\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"245.819178\" xlink:href=\"#m92a212e5af\" y=\"88.163227\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"158.670116\" xlink:href=\"#m92a212e5af\" y=\"206.198663\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"275.087342\" xlink:href=\"#m92a212e5af\" y=\"125.038927\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"199.946095\" xlink:href=\"#m92a212e5af\" y=\"143.289059\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"268.023722\" xlink:href=\"#m92a212e5af\" y=\"112.317659\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"273.05032\" xlink:href=\"#m92a212e5af\" y=\"173.609495\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"258.246605\" xlink:href=\"#m92a212e5af\" y=\"150.14171\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"189.061773\" xlink:href=\"#m92a212e5af\" y=\"203.552211\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"230.836289\" xlink:href=\"#m92a212e5af\" y=\"114.338594\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"289.301972\" xlink:href=\"#m92a212e5af\" y=\"124.20046\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"224.898085\" xlink:href=\"#m92a212e5af\" y=\"104.258008\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"302.051371\" xlink:href=\"#m92a212e5af\" y=\"94.520409\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"203.682792\" xlink:href=\"#m92a212e5af\" y=\"127.295183\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"181.825431\" xlink:href=\"#m92a212e5af\" y=\"134.224593\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"242.776755\" xlink:href=\"#m92a212e5af\" y=\"158.033943\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"183.239189\" xlink:href=\"#m92a212e5af\" y=\"195.829833\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"336.131318\" xlink:href=\"#m92a212e5af\" y=\"108.218298\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"159.142802\" xlink:href=\"#m92a212e5af\" y=\"174.49333\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"213.597034\" xlink:href=\"#m92a212e5af\" y=\"147.948879\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"144.473375\" xlink:href=\"#m92a212e5af\" y=\"179.959871\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"280.730661\" xlink:href=\"#m92a212e5af\" y=\"155.709984\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"314.418174\" xlink:href=\"#m92a212e5af\" y=\"124.287434\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"181.371961\" xlink:href=\"#m92a212e5af\" y=\"131.394135\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"171.077091\" xlink:href=\"#m92a212e5af\" y=\"214.756364\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"358.064631\" xlink:href=\"#m92a212e5af\" y=\"86.985391\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"170.032935\" xlink:href=\"#m92a212e5af\" y=\"161.037103\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"182.138847\" xlink:href=\"#m92a212e5af\" y=\"198.784305\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"181.600549\" xlink:href=\"#m92a212e5af\" y=\"137.202858\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"300.537549\" xlink:href=\"#m92a212e5af\" y=\"119.343827\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"223.932031\" xlink:href=\"#m92a212e5af\" y=\"179.000336\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"224.427778\" xlink:href=\"#m92a212e5af\" y=\"187.549202\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"226.108099\" xlink:href=\"#m92a212e5af\" y=\"169.485891\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"189.234175\" xlink:href=\"#m92a212e5af\" y=\"166.196451\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"251.358269\" xlink:href=\"#m92a212e5af\" y=\"151.458494\"/>\r\n     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"121.106493\" xlink:href=\"#m92a212e5af\" y=\"178.07494\"/>\r\n    </g>\r\n   </g>\r\n   <g id=\"matplotlib.axis_1\">\r\n    <g id=\"xtick_1\">\r\n     <g id=\"line2d_1\">\r\n      <defs>\r\n       <path d=\"M 0 0 \r\nL 0 3.5 \r\n\" id=\"m2c07370e8c\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n      </defs>\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"83.075216\" xlink:href=\"#m2c07370e8c\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_1\">\r\n      <!-- −3 -->\r\n      <g transform=\"translate(75.704122 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 10.59375 35.5 \r\nL 73.1875 35.5 \r\nL 73.1875 27.203125 \r\nL 10.59375 27.203125 \r\nz\r\n\" id=\"DejaVuSans-8722\"/>\r\n        <path d=\"M 40.578125 39.3125 \r\nQ 47.65625 37.796875 51.625 33 \r\nQ 55.609375 28.21875 55.609375 21.1875 \r\nQ 55.609375 10.40625 48.1875 4.484375 \r\nQ 40.765625 -1.421875 27.09375 -1.421875 \r\nQ 22.515625 -1.421875 17.65625 -0.515625 \r\nQ 12.796875 0.390625 7.625 2.203125 \r\nL 7.625 11.71875 \r\nQ 11.71875 9.328125 16.59375 8.109375 \r\nQ 21.484375 6.890625 26.8125 6.890625 \r\nQ 36.078125 6.890625 40.9375 10.546875 \r\nQ 45.796875 14.203125 45.796875 21.1875 \r\nQ 45.796875 27.640625 41.28125 31.265625 \r\nQ 36.765625 34.90625 28.71875 34.90625 \r\nL 20.21875 34.90625 \r\nL 20.21875 43.015625 \r\nL 29.109375 43.015625 \r\nQ 36.375 43.015625 40.234375 45.921875 \r\nQ 44.09375 48.828125 44.09375 54.296875 \r\nQ 44.09375 59.90625 40.109375 62.90625 \r\nQ 36.140625 65.921875 28.71875 65.921875 \r\nQ 24.65625 65.921875 20.015625 65.03125 \r\nQ 15.375 64.15625 9.8125 62.3125 \r\nL 9.8125 71.09375 \r\nQ 15.4375 72.65625 20.34375 73.4375 \r\nQ 25.25 74.21875 29.59375 74.21875 \r\nQ 40.828125 74.21875 47.359375 69.109375 \r\nQ 53.90625 64.015625 53.90625 55.328125 \r\nQ 53.90625 49.265625 50.4375 45.09375 \r\nQ 46.96875 40.921875 40.578125 39.3125 \r\nz\r\n\" id=\"DejaVuSans-51\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-51\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_2\">\r\n     <g id=\"line2d_2\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"128.829384\" xlink:href=\"#m2c07370e8c\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_2\">\r\n      <!-- −2 -->\r\n      <g transform=\"translate(121.458291 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 19.1875 8.296875 \r\nL 53.609375 8.296875 \r\nL 53.609375 0 \r\nL 7.328125 0 \r\nL 7.328125 8.296875 \r\nQ 12.9375 14.109375 22.625 23.890625 \r\nQ 32.328125 33.6875 34.8125 36.53125 \r\nQ 39.546875 41.84375 41.421875 45.53125 \r\nQ 43.3125 49.21875 43.3125 52.78125 \r\nQ 43.3125 58.59375 39.234375 62.25 \r\nQ 35.15625 65.921875 28.609375 65.921875 \r\nQ 23.96875 65.921875 18.8125 64.3125 \r\nQ 13.671875 62.703125 7.8125 59.421875 \r\nL 7.8125 69.390625 \r\nQ 13.765625 71.78125 18.9375 73 \r\nQ 24.125 74.21875 28.421875 74.21875 \r\nQ 39.75 74.21875 46.484375 68.546875 \r\nQ 53.21875 62.890625 53.21875 53.421875 \r\nQ 53.21875 48.921875 51.53125 44.890625 \r\nQ 49.859375 40.875 45.40625 35.40625 \r\nQ 44.1875 33.984375 37.640625 27.21875 \r\nQ 31.109375 20.453125 19.1875 8.296875 \r\nz\r\n\" id=\"DejaVuSans-50\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-50\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_3\">\r\n     <g id=\"line2d_3\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"174.583553\" xlink:href=\"#m2c07370e8c\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_3\">\r\n      <!-- −1 -->\r\n      <g transform=\"translate(167.212459 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 12.40625 8.296875 \r\nL 28.515625 8.296875 \r\nL 28.515625 63.921875 \r\nL 10.984375 60.40625 \r\nL 10.984375 69.390625 \r\nL 28.421875 72.90625 \r\nL 38.28125 72.90625 \r\nL 38.28125 8.296875 \r\nL 54.390625 8.296875 \r\nL 54.390625 0 \r\nL 12.40625 0 \r\nz\r\n\" id=\"DejaVuSans-49\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-49\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_4\">\r\n     <g id=\"line2d_4\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"220.337721\" xlink:href=\"#m2c07370e8c\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_4\">\r\n      <!-- 0 -->\r\n      <g transform=\"translate(217.156471 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 31.78125 66.40625 \r\nQ 24.171875 66.40625 20.328125 58.90625 \r\nQ 16.5 51.421875 16.5 36.375 \r\nQ 16.5 21.390625 20.328125 13.890625 \r\nQ 24.171875 6.390625 31.78125 6.390625 \r\nQ 39.453125 6.390625 43.28125 13.890625 \r\nQ 47.125 21.390625 47.125 36.375 \r\nQ 47.125 51.421875 43.28125 58.90625 \r\nQ 39.453125 66.40625 31.78125 66.40625 \r\nz\r\nM 31.78125 74.21875 \r\nQ 44.046875 74.21875 50.515625 64.515625 \r\nQ 56.984375 54.828125 56.984375 36.375 \r\nQ 56.984375 17.96875 50.515625 8.265625 \r\nQ 44.046875 -1.421875 31.78125 -1.421875 \r\nQ 19.53125 -1.421875 13.0625 8.265625 \r\nQ 6.59375 17.96875 6.59375 36.375 \r\nQ 6.59375 54.828125 13.0625 64.515625 \r\nQ 19.53125 74.21875 31.78125 74.21875 \r\nz\r\n\" id=\"DejaVuSans-48\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_5\">\r\n     <g id=\"line2d_5\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"266.091889\" xlink:href=\"#m2c07370e8c\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_5\">\r\n      <!-- 1 -->\r\n      <g transform=\"translate(262.910639 239.238437)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-49\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_6\">\r\n     <g id=\"line2d_6\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"311.846058\" xlink:href=\"#m2c07370e8c\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_6\">\r\n      <!-- 2 -->\r\n      <g transform=\"translate(308.664808 239.238437)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-50\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_7\">\r\n     <g id=\"line2d_7\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"357.600226\" xlink:href=\"#m2c07370e8c\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_7\">\r\n      <!-- 3 -->\r\n      <g transform=\"translate(354.418976 239.238437)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-51\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n   </g>\r\n   <g id=\"matplotlib.axis_2\">\r\n    <g id=\"ytick_1\">\r\n     <g id=\"line2d_8\">\r\n      <defs>\r\n       <path d=\"M 0 0 \r\nL -3.5 0 \r\n\" id=\"m5578e5deac\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n      </defs>\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m5578e5deac\" y=\"207.234947\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_8\">\r\n      <!-- −2.5 -->\r\n      <g transform=\"translate(7.2 211.034165)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 10.6875 12.40625 \r\nL 21 12.40625 \r\nL 21 0 \r\nL 10.6875 0 \r\nz\r\n\" id=\"DejaVuSans-46\"/>\r\n        <path d=\"M 10.796875 72.90625 \r\nL 49.515625 72.90625 \r\nL 49.515625 64.59375 \r\nL 19.828125 64.59375 \r\nL 19.828125 46.734375 \r\nQ 21.96875 47.46875 24.109375 47.828125 \r\nQ 26.265625 48.1875 28.421875 48.1875 \r\nQ 40.625 48.1875 47.75 41.5 \r\nQ 54.890625 34.8125 54.890625 23.390625 \r\nQ 54.890625 11.625 47.5625 5.09375 \r\nQ 40.234375 -1.421875 26.90625 -1.421875 \r\nQ 22.3125 -1.421875 17.546875 -0.640625 \r\nQ 12.796875 0.140625 7.71875 1.703125 \r\nL 7.71875 11.625 \r\nQ 12.109375 9.234375 16.796875 8.0625 \r\nQ 21.484375 6.890625 26.703125 6.890625 \r\nQ 35.15625 6.890625 40.078125 11.328125 \r\nQ 45.015625 15.765625 45.015625 23.390625 \r\nQ 45.015625 31 40.078125 35.4375 \r\nQ 35.15625 39.890625 26.703125 39.890625 \r\nQ 22.75 39.890625 18.8125 39.015625 \r\nQ 14.890625 38.140625 10.796875 36.28125 \r\nz\r\n\" id=\"DejaVuSans-53\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-50\"/>\r\n       <use x=\"147.412109\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"179.199219\" xlink:href=\"#DejaVuSans-53\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_2\">\r\n     <g id=\"line2d_9\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m5578e5deac\" y=\"179.659241\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_9\">\r\n      <!-- 0.0 -->\r\n      <g transform=\"translate(15.579688 183.45846)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_3\">\r\n     <g id=\"line2d_10\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m5578e5deac\" y=\"152.083536\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_10\">\r\n      <!-- 2.5 -->\r\n      <g transform=\"translate(15.579688 155.882754)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-50\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-53\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_4\">\r\n     <g id=\"line2d_11\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m5578e5deac\" y=\"124.50783\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_11\">\r\n      <!-- 5.0 -->\r\n      <g transform=\"translate(15.579688 128.307049)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-53\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_5\">\r\n     <g id=\"line2d_12\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m5578e5deac\" y=\"96.932125\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_12\">\r\n      <!-- 7.5 -->\r\n      <g transform=\"translate(15.579688 100.731344)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 8.203125 72.90625 \r\nL 55.078125 72.90625 \r\nL 55.078125 68.703125 \r\nL 28.609375 0 \r\nL 18.3125 0 \r\nL 43.21875 64.59375 \r\nL 8.203125 64.59375 \r\nz\r\n\" id=\"DejaVuSans-55\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-55\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-53\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_6\">\r\n     <g id=\"line2d_13\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m5578e5deac\" y=\"69.356419\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_13\">\r\n      <!-- 10.0 -->\r\n      <g transform=\"translate(9.217188 73.155638)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-49\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_7\">\r\n     <g id=\"line2d_14\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m5578e5deac\" y=\"41.780714\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_14\">\r\n      <!-- 12.5 -->\r\n      <g transform=\"translate(9.217188 45.579933)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-49\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-50\"/>\r\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-53\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_8\">\r\n     <g id=\"line2d_15\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m5578e5deac\" y=\"14.205008\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_15\">\r\n      <!-- 15.0 -->\r\n      <g transform=\"translate(9.217188 18.004227)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-49\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-53\"/>\r\n       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n   </g>\r\n   <g id=\"patch_3\">\r\n    <path d=\"M 38.482813 224.64 \r\nL 38.482813 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n   </g>\r\n   <g id=\"patch_4\">\r\n    <path d=\"M 373.282813 224.64 \r\nL 373.282813 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n   </g>\r\n   <g id=\"patch_5\">\r\n    <path d=\"M 38.482812 224.64 \r\nL 373.282812 224.64 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n   </g>\r\n   <g id=\"patch_6\">\r\n    <path d=\"M 38.482812 7.2 \r\nL 373.282812 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n   </g>\r\n  </g>\r\n </g>\r\n <defs>\r\n  <clipPath id=\"pdb29a83604\">\r\n   <rect height=\"217.44\" width=\"334.8\" x=\"38.482813\" y=\"7.2\"/>\r\n  </clipPath>\r\n </defs>\r\n</svg>\r\n",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     }
    }
   ],
   "source": [
    "# 数据可视化\n",
    "X,y = loadData(filepath)\n",
    "print(y[0][0])\n",
    "data_x_1 = []\n",
    "data_y_1 = []\n",
    "data_x_0 = []\n",
    "data_y_0 = []\n",
    "data = []\n",
    "for i in X:\n",
    "    data.append(i[1:])\n",
    "for i in range(len(y)):\n",
    "    if y[i][0] == 0:\n",
    "        data_x_0.append(data[i][0])\n",
    "        data_y_0.append(data[i][1])\n",
    "    elif y[i][0] == 1:\n",
    "        data_x_1.append(data[i][0])\n",
    "        data_y_1.append(data[i][1])\n",
    "plt.figure(20*20)\n",
    "plt.scatter(data_x_0,data_y_0,color='b')\n",
    "plt.scatter(data_x_1,data_y_1,c='r',marker='s')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# sigmoid函数\n",
    "def sigmoid(inX):\n",
    "    return 1 / (1+np.exp(-inX))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 梯度上升法\n",
    "def gradAscent(dataMat, labelMat):\n",
    "    dataMatrix = np.mat(dataMat)\n",
    "    classLabels = np.mat(labelMat)\n",
    "#     print(classLabels)\n",
    "    m,n = np.shape(dataMatrix)\n",
    "    alpha = 0.001 #设置梯度的阀值，该值越大梯度上升幅度越大 ,即为步长\n",
    "    maxCycles = 500\n",
    "    weights = np.ones((n,1))\n",
    "#     print(weights)\n",
    "    for k in range(maxCycles):\n",
    "        error=0\n",
    "        for i in range(m):\n",
    "            h = sigmoid(dataMatrix[i]*weights)\n",
    "            error += dataMatrix[i].transpose()*(classLabels[i]-h)\n",
    "        weights = weights + alpha*error\n",
    "    return weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 梯度下降\n",
    "def gradientDescent(dataMat, labelMat,alpha):\n",
    "    dataMatrix = np.mat(dataMat)  # 将数据转化为矩阵  100*3\n",
    "    labelMatrix = np.mat(labelMat)  # 1*100\n",
    "#     print(np.shape(dataMatrix), np.shape(labelMatrix))\n",
    "    m, n = np.shape(dataMatrix)\n",
    "    weights = np.zeros((n,1))  # 3*1\n",
    "#     alpha = 0.001 # 设置步长\n",
    "    interation = 500 # 迭代次数\n",
    "    for k in range(interation):\n",
    "        error=0\n",
    "        for i in range(m):\n",
    "            h = sigmoid(dataMatrix[i]*weights)\n",
    "            error += dataMatrix[i].transpose()*(h - labelMatrix[i])\n",
    "        weights= weights-alpha*error\n",
    "    return weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 随机梯度下降法\n",
    "def rdgradDescent(dataMat, labelMat,alpha):\n",
    "    dataMatrix = np.mat(dataMat)\n",
    "    labelMatrix = np.mat(labelMat)\n",
    "    print(np.shape(labelMatrix))\n",
    "    m,n = np.shape(dataMatrix)\n",
    "    weights = np.ones((n,1))\n",
    "    iteration = 1000 # 迭代次数\n",
    "    for k in range(iteration):\n",
    "        for i in range(m):\n",
    "            h = sigmoid(dataMatrix[i]*weights)\n",
    "            error = (h-labelMatrix[i])\n",
    "            weights= weights-alpha*dataMatrix[i].transpose()*error\n",
    "    return weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 改进版的随机梯度下降\n",
    "def stocrdgradDescent(data,label,alpha):\n",
    "    dataMatrix = np.mat(data)\n",
    "#     print(np.shape(dataMatrix))\n",
    "    labelMatrix = np.mat(label)\n",
    "    m,n = np.shape(dataMatrix)\n",
    "    weights=np.zeros((n,1))\n",
    "    iteration = 1000\n",
    "    for k in range(iteration):\n",
    "        dataIndex = [i for i in range(m)]\n",
    "        for i in range(m):\n",
    "            alpha = 4/(1+k+i)+0.0001\n",
    "            randIndex= int(np.random.uniform(0,len(dataIndex)))\n",
    "            h = sigmoid(dataMatrix[randIndex]*weights)\n",
    "            error = h-labelMatrix[randIndex]\n",
    "            weights -= alpha*dataMatrix[randIndex].transpose()*error\n",
    "    return weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "datamat,labelmat = loadData(filepath)\n",
    "weights=gradientDescent(datamat, labelmat,0.001)\n",
    "# weights=rdgradDescent(datamat,labelmat, 0.001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotBestFit(weights):  #画出最终分类的图\n",
    "    import matplotlib.pyplot as plt\n",
    "    dataMat,labelMat=loadData(filepath)\n",
    "    dataArr = np.array(dataMat)\n",
    "    n = np.shape(dataArr)[0]\n",
    "    xcord1 = []; ycord1 = []\n",
    "    xcord2 = []; ycord2 = []\n",
    "    for i in range(n):\n",
    "        if int(labelMat[i][0])== 1:\n",
    "            xcord1.append(dataArr[i,1])\n",
    "            ycord1.append(dataArr[i,2])\n",
    "        else:\n",
    "            xcord2.append(dataArr[i,1])\n",
    "            ycord2.append(dataArr[i,2])\n",
    "    fig = plt.figure()\n",
    "    ax = fig.add_subplot(111)\n",
    "    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')\n",
    "    ax.scatter(xcord2, ycord2, s=30, c='green')\n",
    "    x = np.arange(-3.0, 3.0, 0.1)\n",
    "    print(np.shape(x))\n",
    "    y = (-weights[0]-weights[1].transpose()*x)/weights[2]\n",
    "#     y = (weights[1]+weights[2]).transpose()*x + weights[0]\n",
    "    y = y.transpose()\n",
    "    ax.plot(x, y)\n",
    "    plt.xlabel('X1')\n",
    "    plt.ylabel('X2')     \n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 4.12414349]\n",
      " [ 0.48007329]\n",
      " [-0.6168482 ]]\n",
      "(60,)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "datamat,labelmat = loadData(filepath)\n",
    "# weights=gradientDescent(datamat, labelmat,0.001)  # 梯度下降法\n",
    "# print(np.shape(weights[1]))\n",
    "# weights=rdgradDescent(datamat,labelmat, 0.001)   # 随机梯度下降法\n",
    "weights=gradAscent(datamat,labelmat)   # 梯度上升\n",
    "# weights=stocrdgradDescent(datamat, labelmat,0.001)  # 改变步长的随机梯度下降\n",
    "print(weights)\n",
    "plotBestFit(weights)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.4-final"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}